//#include "BoundaryField.h"
//#include "Time/SimulationTime.h"
//
//template<class Type>
//BoundaryField<Type>::BoundaryField(string name_, Config* config_, ParallelMPI* pmpi_, std::string faceGroupName_) :
//    name(name_),
//    config(config_),
//    pmpi(pmpi_),
//    mesh(config_->mesh),
//    faceGroupName(faceGroupName_)
//{
//    int faceNumber;
//    int faceNumberGlobal;
//
//    if (config->dimension == 3)
//    {
//        auto& faceGroup = mesh->faceGroupMap.find(faceGroupName)->second;
//        faceNumber = faceGroup.numberFace;
//        faceNumberGlobal = faceGroup.numberFaceSerial;
//    }
//    else if (config->dimension == 2)
//    {
//        auto& lineGroup = mesh->lineGroupMap.find(faceGroupName)->second;
//        faceNumber = lineGroup.numberLine;
//        faceNumberGlobal = lineGroup.numberLineSerial;
//    }
//    else
//    {
//        log_error << "the dimension not support: " << config->dimension;
//        exit(0);
//    }
//
//
//
//
//
//    data.resize(faceNumber);
//    data_average.resize(faceNumber);
//
//    data_global.resize(faceNumberGlobal);
//    data_average_global.resize(faceNumberGlobal);
//    data_global_temp.resize(faceNumberGlobal);
//
//}
//
//
//
//template<class Type>
//BoundaryField<Type>::BoundaryField(EasyMesh::ParallelMesh* mesh_) :
//    mesh(mesh_)
//{
//
//}
//
//
//template<class Type>
//BoundaryField<Type>::BoundaryField(const BoundaryField<Type>& boundaryField) :
//    name(boundaryField.name),
//    config(boundaryField.config),
//    pmpi(boundaryField.pmpi),
//    mesh(boundaryField.mesh),
//    faceGroupName(boundaryField.faceGroupName)
//{
//    int faceNumber = boundaryField.data.size();
//    data.resize(faceNumber);
//    data_average.resize(faceNumber);
//
//    int faceNumberGlobal = boundaryField.data_global.size();
//    data_global.resize(faceNumberGlobal);
//    data_average_global.resize(faceNumberGlobal);
//    data_global_temp.resize(faceNumberGlobal);
//
//}
//
//
//template<class Type>
//void BoundaryField<Type>::operator=(const BoundaryField<Type>& boundaryField)
//{
//    name = boundaryField.name;
//    config = boundaryField.config;
//    pmpi = boundaryField.pmpi;
//    mesh = boundaryField.mesh;
//    faceGroupName = boundaryField.faceGroupName;
//
//    int faceNumber = boundaryField.data.size();
//    data.resize(faceNumber);
//    data_average.resize(faceNumber);
//
//    int faceNumberGlobal = boundaryField.data_global.size();
//    data_global.resize(faceNumberGlobal);
//    data_average_global.resize(faceNumberGlobal);
//    data_global_temp.resize(faceNumberGlobal);
//
//}
//
//
//template<class Type>
//BoundaryField<Type>::~BoundaryField()
//{
//    //log_info<<"destroying BoundaryField";
//}
//
//
//template<class Type>
//void BoundaryField<Type>::cal_average_field()
//{
//
//}
//
//template<>
//void BoundaryField<double>::cal_average_field()
//{
//    //log_info << "cal average field for boundary field";
//
//    if(config->sim_time->is_time_io_reset())
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            //log_info << data.size() << " " << i;
//            data_average[i] = 0.0;
//        }
//    }
//
//    //log_info << data.size();
//    for(int i = 0; i < data.size(); i++)
//    {
//        //log_info << data.size() << " " << i;
//        data_average[i] += data[i];
//    }
//
//    if(config->sim_time->is_time_io())
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            data_average[i] /= config->sim_time->timestep_io;
//        }
//    }
//
//    //log_info << "end cal average field for boundary field";
//}
//
//
//template<class Type>
//void BoundaryField<Type>::cal_global_field()
//{
//    
//}
//
//template<>
//void BoundaryField<double>::cal_global_field()
//{
//
//
//    if (config->dimension == 3)
//    {
//        auto& faceGroup = mesh->faceGroupMap.find(faceGroupName)->second;
//
//        //gather data_average
//        for (int iFaceIndexGlobal = 0; iFaceIndexGlobal < faceGroup.localFaceIndexList.size(); iFaceIndexGlobal++)
//        {
//            int iFaceIndexLocal = faceGroup.localFaceIndexList[iFaceIndexGlobal];
//            if (iFaceIndexLocal == -1)
//            {
//                data_global_temp[iFaceIndexGlobal] = 0.0;
//            }
//            else
//            {
//                data_global_temp[iFaceIndexGlobal] = data_average[iFaceIndexLocal];
//            }
//        }
//        pmpi->all_reduce_sum_double(data_global_temp.data(), data_average_global.data(), data_average_global.size());
//
//        //gather data
//        for (int iFaceIndexGlobal = 0; iFaceIndexGlobal < faceGroup.localFaceIndexList.size(); iFaceIndexGlobal++)
//        {
//            int iFaceIndexLocal = faceGroup.localFaceIndexList[iFaceIndexGlobal];
//            if (iFaceIndexLocal == -1)
//            {
//                data_global_temp[iFaceIndexGlobal] = 0.0;
//            }
//            else
//            {
//                data_global_temp[iFaceIndexGlobal] = data[iFaceIndexLocal];
//            }
//        }
//        pmpi->all_reduce_sum_double(data_global_temp.data(), data_global.data(), data_average_global.size());
//    }
//    else if (config->dimension == 2)
//    {
//        //if (config->debugLevel > 1) log_info << "boundaryFields faceGroupName: " << faceGroupName;
//        auto& lineGroup = mesh->lineGroupMap.find(faceGroupName)->second;
//
//        //gather data_average
//        for (int iLinendexGlobal = 0; iLinendexGlobal < lineGroup.localLineIndexList.size(); iLinendexGlobal++)
//        {
//            int iLineIndexLocal = lineGroup.localLineIndexList[iLinendexGlobal];
//            if (iLineIndexLocal == -1)
//            {
//                data_global_temp[iLinendexGlobal] = 0.0;
//            }
//            else
//            {
//                data_global_temp[iLinendexGlobal] = data_average[iLineIndexLocal];
//            }
//        }
//        pmpi->all_reduce_sum_double(data_global_temp.data(), data_average_global.data(), data_average_global.size());
//
//        //gather data
//        for (int iLinendexGlobal = 0; iLinendexGlobal < lineGroup.localLineIndexList.size(); iLinendexGlobal++)
//        {
//            int iLineIndexLocal = lineGroup.localLineIndexList[iLinendexGlobal];
//            if (iLineIndexLocal == -1)
//            {
//                data_global_temp[iLinendexGlobal] = 0.0;
//            }
//            else
//            {
//                data_global_temp[iLinendexGlobal] = data[iLineIndexLocal];
//            }
//        }
//        pmpi->all_reduce_sum_double(data_global_temp.data(), data_global.data(), data_average_global.size());
//    }
//    else
//    {
//        log_error << "the dimension not support: " << config->dimension;
//        exit(0);
//    }
//
//}
//
//
//template class BoundaryField<double>;
//
//
//
//
//
//template<class Type>
//BoundaryFieldCollection<Type>::BoundaryFieldCollection(string name_, Config* config_, ParallelMPI* pmpi_) :
//    name(name_),
//    config(config_),
//    pmpi(pmpi_),
//    mesh(config_->mesh)
//{
//    
//
//
//    if (config->dimension == 3)
//    {
//        for (auto iter = mesh->faceGroupMap.begin(); iter != mesh->faceGroupMap.end(); iter++)
//        {
//            auto faceGroupName = iter->first;
//            auto& faceGroup = iter->second;
//
//            if (faceGroupName == "parallelFace")
//            {
//                continue;
//            }
//
//            BoundaryField<Type> boundaryField(name, config, pmpi, faceGroupName);
//            boundaryFieldMap[faceGroupName] = boundaryField;
//        }
//    }
//    else if (config->dimension == 2)
//    {
//        for (auto iter = mesh->lineGroupMap.begin(); iter != mesh->lineGroupMap.end(); iter++)
//        {
//            auto lineGroupName = iter->first;
//            auto& lineGroup = iter->second;
//
//            if (lineGroupName == "parallelFace" || lineGroupName == "parallelLine")
//            {
//                continue;
//            }
//
//            BoundaryField<Type> boundaryField(name, config, pmpi, lineGroupName);
//            boundaryFieldMap[lineGroupName] = boundaryField;
//        }
//    }
//    else
//    {
//        log_error << "the dimension not support: " << config->dimension;
//        exit(0);
//    }
//
//
//
//
//}
//
//
//template class BoundaryFieldCollection<double>;